package grameball;

import java.awt.Point;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;

/**
 *Tale classe permette il movimento della palla e del mirino, creando un nuovo Thread di movimento, o per uno o per l'altro,
 * in quanto sia il mirino che per la palla il modo di muoversi nella pisa è identico.
 * @author Meco.Klodian (Granad)
 */
public class MoveXO extends Thread
{
    /**
     * Direzione del movimento.
     */
    private String is;
    /**
     * Punto da traslocare durante il movimento, il quale nel costruttore puntera al punto
     * di locazione o della palla o del mirino, per ottenre una modifica in loro.
     */
    private Point xy;
    /**
     * Tale variabile di tipo JLabel puntera o alla palla o al mirino, per modificare il loro metodo
     * setLocation.
     */
    private JLabel who;
    /**
     * Utilizzata per il movimento della palla, essa conta il numero di passa effettuato in una direzione,
     * ed azzerata in cambio direzione.
     */
    public int howStep;
    /**
     * Velocita del movimento.
     */
    private int speed;

    public MoveXO(String where, Point xy, JLabel who, int s)
    {
        is = where;
        this.xy = xy;
        this.who = who;
        howStep = 0;
        speed = s;
    }

    /**
     * Esso modifica i valori di xy dell'oggetto studiato per poi dopo riportare le modifiche mediante il richiamo del
     * metodo setLocation per avere il movimento visuale degli oggetti nel frame.
     *
     * Up
     *  in caso si cerchi di andare oltre l'area si viene trasportati dall'altra parte in basso.
     * Down
     *  in caso di cerchi andare olte l'area di movimento si viene trasportati dall'altra parte
     * Left
     *  .....
     * Right
     *  ....
     */
    @Override
    public void run()
    {
        while(true)
        {
            if(is.equals("up"))
            {
                if(!(xy.y < 0))
                    xy.translate(0, -1);
                else
                    xy.y = VisualFrame.HP-20;
            }

            if(is.equals("down"))
            {
                xy.translate(0, 1);
                xy.y = xy.y % (VisualFrame.HP-20);
            }

            if(is.equals("left"))
            {
                if(!(xy.x < 0))
                    xy.translate(-1, 0);
                else
                    xy.x = VisualFrame.WP-26;
            }

            if(is.equals("right"))
            {
                xy.translate(1, 0);
                xy.x = xy.x % (VisualFrame.WP-26);
            }
            who.setLocation(xy);
            howStep++;
            try {
                sleep(speed);
            } catch (InterruptedException ex) {
                Logger.getLogger(MoveXO.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     *
     * @return IL numero di passi effettuato nella direzione attuale.
     */
    public int getHowStep()
    {
        return howStep;
    }

    /**
     * Imposta la nuova direzione. Ed azzera i passi precedenti.
     * @param dir   Direzione da effettuare ora.
     */
    public void setDir(String dir)
    {
        is = dir;
        howStep = 0;
    }
    /**
     * Imposta il tempo di sleep di tale Thread
     * @param s t di sleep.
     */
    public void setSpeed(int s)
    {
        if(s < 10)
            speed = 10;
        else
            speed = s;
    }
    /**
     * Ritorna il tempo di sleep.
     * @return valore variabile sleep.-
     */
    public int getSpeed()
    {
        return speed;
    }
}
